package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

// 定义一个结构体，用于保存统计结构
type CharCount struct {
	ChCount    int //记录英文个数
	NumCount   int //记录数字个数
	SpaceCount int //记录空格个数
	OtherCount int //记录其他字符个数
}

// 统计一个文件中的英文、数字、空格以及其他字符的个数
func main() {
	//文件路径
	filePath := "e:/abc.txt"

	//打开文件
	file, err := os.Open(filePath)

	//打开是否异常 异常则return
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
	}

	//打开后及时关闭 放置内存泄漏
	defer file.Close()

	//非异常则创一个Reader bufio.NewReader(file)
	reader := bufio.NewReader(file)

	//定义一个CharCount实例
	var count CharCount

	//开始循环读取文件内容 reader.ReandString('\n')
	for {
		//如果循环中读到末尾 io.EOF则退出循环
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}

		//否则 每读取一行遍历一次
		for _, v := range str {
			switch {
			case v >= 'a' && v <= 'z':
				fallthrough //穿透
			case v >= 'A' && v <= 'Z':
				count.ChCount++
			case v == ' ' || v == '\t':
				count.SpaceCount++
			case v >= '0' && v <= '9':
				count.NumCount++
			default:
				count.OtherCount++
			}
		}
	}
	fmt.Printf("字符个数为%d\t数字个数为%d\t空格个数为%d\t其他字符个数为%d\t",
		count.ChCount, count.NumCount, count.SpaceCount, count.OtherCount)

}
